package com.qf.controller;

import com.qf.util.RedisLockUtil;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 模拟秒杀下单
 * @author 千锋健哥
 */
@RestController
@RequestMapping("/seckill")
public class SeckillController {

    //1. 模拟全局变量, 库存量
    public static Map<String, Integer> itemStock = new HashMap<>();

    //2. 模拟用户下的订单
    public static Map<String , Integer> itemOrder = new HashMap<>();

    //连接zookeeper服务器对象, 注入
    @Autowired
    private CuratorFramework cf;

    @Autowired
    private RedisLockUtil lockUtil;

    /**
     * 静态代码块, 初始化全局变量中的数据
     * @param item
     * @return
     */
    static {
        //库存数量初始化
        itemStock.put("001", 10000);
        //订单数量初始化
        itemOrder.put("001", 0);
    }

    /**
     * 秒杀下单业务
     * @param item
     * @return
     */
    @GetMapping("/kill")
    public String kill(String item) throws Exception {

        //======================zookeeper加锁  开始=============================
       // InterProcessMutex lock = new InterProcessMutex(cf, "/lock");
        //if (lock.acquire(1, TimeUnit.SECONDS)) {
        //======================zookeeper加锁  结束=============================

        //========================redis  加锁   开始===========================
        if (lockUtil.lock("lock", String.valueOf(System.currentTimeMillis()), 1)) {
        //========================redis  加锁   结束===========================

            //1. 获取库存量
            Integer count = itemStock.get(item);

            //2. 判断如果库存量小于等于0, 不允许下单
            if (count <= 0) {
                return "库存不足, 不允许下单!";
            }

            //3. 创建订单
            itemOrder.put(item, itemOrder.get(item) + 1);

            //4. 扣减库存
            itemStock.put(item, itemStock.get(item) - 1);

            //======================zookeeper解锁  开始=============================
            //lock.release();
            //======================zookeeper解锁  结束=============================

            //========================redis  解锁  开始===========================
            lockUtil.unlock("lock");
            //========================redis  解锁   结束===========================
        } else {
            return "您没有抢购到!";
        }

        //5. 返回订单数量和扣减库存数量结果
        return "下单成功, 订单量目前为:" + itemOrder.get(item) +", 库存量目前为:" + itemStock.get(item);
    }
}
